Skip to content

feat: Implement per-app refresh rate - #564

Open
Mudit200408 wants to merge 7 commits into
sameerasw:developfrom
Mudit200408:feat-per-app-rr
Open

feat: Implement per-app refresh rate#564
Mudit200408 wants to merge 7 commits into
sameerasw:developfrom
Mudit200408:feat-per-app-rr

Conversation

@Mudit200408

Copy link
Copy Markdown
Contributor

No description provided.

- Improve app detection accuracy and filter system noise
thomasborgogno and others added 6 commits July 30, 2026 17:13
## Summary

Adds two new automation trigger types: **Bluetooth device
connected/disconnected** and **Wi-Fi network connected/disconnected**.
Users can now build automations that fire an action when the phone
connects to (or disconnects from) a specific paired Bluetooth device or
a specific Wi-Fi network — the same way existing triggers like Charger
Connected or Schedule work today.

## What's new

- **`Trigger.kt`**: 4 new sealed subtypes —
`BluetoothConnected`/`BluetoothDisconnected` (device address + name) and
`WifiConnected`/`WifiDisconnected` (SSID), all configurable via a
settings sheet like `Trigger.Schedule`.
- **`BluetoothModule`** (new): dynamic `BroadcastReceiver` on
`ACTION_ACL_CONNECTED`/`ACTION_ACL_DISCONNECTED`, filtered by MAC
address.
- **`WifiModule`** (new): `ConnectivityManager.NetworkCallback` on the
Wi-Fi transport, resolving the active SSID via `WifiManager` and firing
on connect/lost.
- **`AutomationManager`**: wires both modules into the existing module
lifecycle (same pattern as Power/Display/Time modules).
- **Editor UI**: two new trigger entries in `AutomationEditorActivity`,
each configurable through a bottom sheet:
- `BluetoothDeviceSelectionSheet` — pick from the phone's paired devices
(requests `BLUETOOTH_CONNECT` on Android 12+).
- `WifiNetworkSelectionSheet` — if the app has **Shizuku** (or root)
authorized, it runs `cmd wifi list-networks` under shell privileges and
lets the user pick straight from the device's saved networks; otherwise
it falls back to manual SSID entry with a "Use Current Network" helper
(requests `ACCESS_FINE_LOCATION`, needed by Android to read the current
SSID).
- **Manifest**: added `ACCESS_WIFI_STATE` (the Bluetooth/location
permissions needed were already present).

## Why

Requested enhancement to make automations react to connectivity context
(e.g. "turn on Wi-Fi calling when connected to home network", "mute when
a specific headset disconnects") without needing a schedule or manual
toggle.

## Test plan

- [ ] Create a Trigger automation on "Bluetooth Device
Connected"/"Disconnected" for a paired device and verify the linked
action fires on connect/disconnect.
- [ ] Create a Trigger automation on "Wi-Fi Network
Connected"/"Disconnected".
- [ ] Verify triggers still fire correctly after the app/service is
killed and restarted (foreground service reattachment).
…iver registration context in BluetoothModule
…selection sheets to use RoundedCardContainer
@sameerasw
sameerasw self-requested a review August 2, 2026 08:08

@sameerasw sameerasw left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi! Can you take a look at these concerns?

Potential Issues & Suggestions

1. Shell Execution Overhead on Main Thread during App Switching

  • Location: AppFlowHandler.kt lines in checkPerAppRefreshRate()
  • Issue: RefreshRateUtils.applyFixedRefreshRate() and applyDynamicRefreshRate() run ShellUtils.runCommand(...) directly on the thread calling checkPerAppRefreshRate().
  • Detail: ShellUtils.runCommand executes su / shizuku shell commands synchronously. Running up to 4 shell commands (settings put system..., settings put global...) per app switch can freeze window transitions or cause noticeable UI latency during app launches.
  • Recommendation: Run RefreshRateUtils shell commands inside a background CoroutineScope(Dispatchers.IO) worker thread to prevent main thread blocking.

2. State Leak if Accessibility / App Detection Service is Stopped

  • Location: AppFlowHandler.kt
  • Issue: If the service crashes or is stopped while a per-app refresh rate is active, restoreFromSnapshot() is never called, leaving the device locked at the custom refresh rate (e.g. 60Hz fixed).
  • Recommendation: Implement a cleanup hook on service destroy (onDestroy()) that checks if perAppRateSnapshot != null and invokes restoreFromSnapshot().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

3 participants